#include <bits/stdc++.h>
using namespace std;
const int SIZE = 1001; // 最大字符串长度
int dp[SIZE][SIZE]; // dp[i][j]存储字符串[i,j]要插入的字符数，使用得其成为“回文”
string s;
int len; // 字符串长度

// 生成dp数组
void getDp() {
  // memset(dp, 0x3f, sizeof(dp));
  /*循环求得的是一个右上角矩阵，其余元素为0，这样做的原因是在解决子问题重复的问题*/
  for (int i = len - 1; i >= 0; i--) {
    for (int j = i; j <= len - 1; j++) {
      if (s[i] == s[j])
        dp[i][j] = dp[i + 1][j - 1];
      else
        dp[i][j] = min(1 + dp[i][j - 1], 1 + dp[i + 1][j]);
    }
  }
}

string getPalindrome() {
  int count = dp[0][len - 1];
  // cout << count;
  // 开始添加字符
  string res(count + len, ' ');
 
  int i = 0, j = len - 1;
  int i2 = 0, j2 = count + len - 1;

  while (i <= j) {   
    if (s[i] == s[j]) {
      // 相等直接复制
      res[i2++] = s[i++];
      res[j2--] = s[j--];
    } else {
      // 不相等看dp
      char tmp = '\0';
      if (dp[i + 1][j] < dp[i][j - 1]) {
        tmp = s[i++];
      } else if (dp[i + 1][j] > dp[i][j - 1]) {
        tmp = s[j--];
      } else {
        if (s[i] < s[j])
          tmp = s[i++];
        else
          tmp = s[j--];
      }
      res[i2++] = tmp;
      res[j2--] = tmp;
    }
  }
  return res;
}

void test() {
  // 测试
  for (int i = 0; i < len; i++) {
    for (int j = 0; j < len; j++) {
      cout << setw(10) << dp[i][j] << " ";
    }
    cout << endl;
  }
}
int main() {

  cin >> s;
  len = s.size(); // 字符串长度
  getDp();
  // test();
  cout << getPalindrome();
  return 0;
}
